home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / util / cli / sploinerwos.lha / source.lha / getbuff.c < prev    next >
C/C++ Source or Header  |  1995-09-26  |  2KB  |  91 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "getbuff.h"
  4.  
  5. typedef struct 
  6. {
  7.   int buf_size;
  8.   int current;
  9.   int top;
  10.   char *data;
  11.   FILE *fp;
  12. } buffer;
  13.  
  14. void *buffer_init(FILE *fp, size_t buf_size)
  15. {
  16.   buffer *buf=(buffer *) malloc(sizeof(buffer));
  17.   if(buf != NULL)
  18.     {
  19.       buf->buf_size=buf_size;
  20.       buf->current=0;
  21.       buf->top=0;
  22.       buf->data=(char *) malloc(buf_size);
  23.     }
  24.   if (buf == NULL || buf->data==NULL)
  25.     {
  26.       fprintf(stderr, "Captain, sensors reveal a distortion in the\n");
  27.       fprintf(stderr, "space/time continuum. We cannot find space\n");
  28.       fprintf(stderr, "for our %lu bytes buffer at this time\n"
  29.           ,(long unsigned int) buf_size);
  30.       fprintf(stderr, "Starfleet is aborting our mission.\n");
  31.       exit(1);
  32.     }
  33.   buf->fp=fp;
  34.   return buf;
  35. }
  36.  
  37. int getcbuf(void *buff)
  38. {
  39.   buffer *buf = (buffer *) buff;
  40.   if (buf->current==buf->top)
  41.     {
  42.       int i;
  43.       i=fread(buf->data, 1, buf->buf_size, buf->fp);
  44.       buf->top=i;
  45.       buf->current=0;
  46.       if (i==0) return EOF;
  47.     }
  48.   return(((buf->data)[buf->current++]) & 0377); /* Return the lower 8 bits */
  49. }
  50.  
  51. int putcbuf(char c, void *buff)
  52. {
  53.   buffer *buf = (buffer *) buff;
  54.   if (buf->current==buf->buf_size)
  55.     {
  56.       int i;
  57.       i=fwrite(buf->data, 1, buf->buf_size, buf->fp);
  58.       buf->current=0;
  59.       if (i!=buf->buf_size) 
  60.     {
  61.       fprintf(stderr,"Write failed - aborting.\n");
  62.       fclose(buf->fp);
  63.       exit(1);
  64.     }
  65.     }
  66.   (buf->data)[buf->current++]=c;
  67.   return 0;
  68. }
  69.  
  70. int flush(void *buff)
  71. {
  72.   buffer *buf = (buffer *) buff;
  73.   int i;
  74.   i = fwrite(buf->data, 1, buf->current, buf->fp);
  75.   if (i!=buf->current) 
  76.     {
  77.       fprintf(stderr,"Write failed - aborting.\n");
  78.       fclose(buf->fp);
  79.       exit(1);
  80.     }
  81.   buf->current=0;
  82.   return i;
  83. }
  84.  
  85. void discard(void *buff)
  86. {
  87.   buffer *buf = (buffer *) buff;
  88.   free(buf->data);
  89.   free(buf);
  90. }
  91.